/**
 * 文件上传工具类
 * 支持OSS PostObject直传和后端代理上传两种方式
 * 兼容微信小程序和安卓APP
 */

// 导入API配置
import { USER_API } from '../config/api.js'

/**
 * 获取当前运行平台
 * @returns {string} 平台标识
 */
function getCurrentPlatform() {
	try {
		const systemInfo = uni.getSystemInfoSync()
		return systemInfo.uniPlatform || 'unknown'
	} catch (error) {
		console.error('获取平台信息失败:', error)
		return 'unknown'
	}
}



/**
 * OSS PostObject直传方法
 * @param {string} filePath 文件路径
 * @param {object} ossConfig OSS配置
 * @returns {Promise<string>} 上传后的文件URL
 */
export async function uploadToOSSDirectly(filePath, ossConfig) {
	return new Promise((resolve, reject) => {
		console.log('=== 开始OSS PostObject直传 ===')
		console.log('文件路径:', filePath)
		console.log('文件路径类型:', typeof filePath)
		console.log('当前平台:', getCurrentPlatform())
		console.log('OSS配置:', ossConfig)

		// 检查文件路径格式
		if (filePath) {
			console.log('文件路径分析:', {
				isHttpUrl: filePath.startsWith('http'),
				isWxFile: filePath.startsWith('wxfile://'),
				isTmpFile: filePath.includes('/tmp/'),
				length: filePath.length
			})
		}

		// 检查必要参数
		if (!ossConfig.bucket_name || !ossConfig.endpoint || !ossConfig.object_key) {
			reject(new Error('OSS配置不完整，缺少bucket_name、endpoint或object_key'))
			return
		}

		// 构建上传URL
		let uploadUrl
		const endpoint = ossConfig.endpoint

		if (endpoint.startsWith('http://') || endpoint.startsWith('https://')) {
			uploadUrl = endpoint.replace('http://', 'https://')
		} else {
			// 对于自定义域名，直接使用endpoint，不需要添加bucket前缀
			uploadUrl = `https://${endpoint}`
		}

		console.log('原始endpoint:', endpoint)
		console.log('构建的上传URL:', uploadUrl)

		// 构建表单数据
		const formData = {
			'key': ossConfig.object_key
		}

		// 使用V4签名方式上传（包含policy）
		if (ossConfig.policy && (ossConfig.x_oss_signature || ossConfig['x-oss-signature'])) {
			console.log('使用V4签名方式上传')

			// V4签名需要的字段
			formData['policy'] = ossConfig.policy
			formData['x-oss-signature-version'] = ossConfig.x_oss_signature_version || 'OSS4-HMAC-SHA256'
			formData['x-oss-credential'] = ossConfig.x_oss_credential || ossConfig['x-oss-credential']
			formData['x-oss-date'] = ossConfig.x_oss_date || ossConfig['x-oss-date']
			formData['x-oss-signature'] = ossConfig.x_oss_signature || ossConfig['x-oss-signature']

			if (ossConfig.security_token) {
				formData['x-oss-security-token'] = ossConfig.security_token
			}
		}
		else {
			console.error('OSS配置缺少必要的V4签名参数')
			console.error('当前后端返回的字段:', Object.keys(ossConfig))
			reject(new Error('OSS配置缺少V4签名参数，请联系后端开发人员检查配置。'))
			return
		}

		// 设置成功状态码
		formData['success_action_status'] = '200'

		console.log('表单数据:', formData)
		console.log('即将发起上传请求...')
		console.log('请求参数详情:', {
			url: uploadUrl,
			filePath: filePath,
			name: 'file',
			formDataKeys: Object.keys(formData),
			formDataSize: JSON.stringify(formData).length
		})

		// 使用uni.uploadFile上传
		uni.uploadFile({
			url: uploadUrl,
			filePath: filePath,
			name: 'file',
			formData: formData,
			success: (uploadRes) => {
				console.log('=== OSS上传成功回调 ===')
				console.log('完整响应:', uploadRes)
				console.log('状态码:', uploadRes.statusCode)
				console.log('响应头:', uploadRes.header)
				console.log('响应数据:', uploadRes.data)

				if (uploadRes.statusCode === 200 || uploadRes.statusCode === 204) {
					// 构建文件访问URL - 对于自定义域名，直接使用endpoint
					const fileUrl = `https://${ossConfig.endpoint}/${ossConfig.object_key}`
					console.log('构建的文件URL:', fileUrl)
					console.log('OSS上传成功!')
					resolve(fileUrl)
				} else {
					console.error('OSS上传失败，状态码:', uploadRes.statusCode)
					console.error('响应详情:', uploadRes)
					reject(new Error(`OSS上传失败，状态码: ${uploadRes.statusCode}`))
				}
			},
			fail: (error) => {
				console.error('=== OSS上传失败回调 ===')
				console.error('错误对象:', error)
				console.error('错误类型:', typeof error)
				console.error('错误键值:', Object.keys(error))
				console.error('errMsg:', error.errMsg)
				console.error('errCode:', error.errCode)

				// 分析具体的错误类型
				if (error.errMsg && error.errMsg.includes('network')) {
					console.error('网络连接错误，可能的原因:')
					console.error('1. 域名解析问题')
					console.error('2. SSL/TLS握手失败')
					console.error('3. 网络超时')
					console.error('4. 防火墙阻拦')
				}

				reject(new Error(`OSS上传失败: ${error.errMsg || error.message || '未知错误'}`))
			}
		})
	})
}



/**
 * 获取STS Token
 * @param {string} token 用户token
 * @param {string} purpose 用途（如'avatar'）
 * @returns {Promise<object>} STS配置
 */
export async function getStsToken(token, purpose = 'avatar') {
	try {
		console.log('=== 获取STS Token ===')

		const response = await uni.request({
			url: USER_API.STS_TOKEN,
			method: 'POST',
			header: {
				'Authorization': `Bearer ${token}`,
				'Content-Type': 'application/json'
			},
			data: {
				purpose: purpose
			}
		})

		console.log('STS Token响应:', response)
		console.log('STS Token数据详情:', response.data)

		if (response.statusCode === 200 && response.data.code === 200) {
			console.log('STS Token获取成功')
			const stsData = response.data.data

			// 详细打印STS数据字段，用于调试
			console.log('STS数据字段检查:', {
				access_key_id: !!stsData.access_key_id,
				bucket_name: !!stsData.bucket_name,
				endpoint: !!stsData.endpoint,
				object_key: !!stsData.object_key,
				region: !!stsData.region,
				security_token: !!stsData.security_token,
				policy: !!stsData.policy,
				signature: !!stsData.signature,
				'x-oss-signature': !!stsData['x-oss-signature'],
				'x-oss-credential': !!stsData['x-oss-credential'],
				'x-oss-date': !!stsData['x-oss-date']
			})

			return stsData
		} else {
			throw new Error(response.data?.message || '获取STS Token失败')
		}
	} catch (error) {
		console.error('获取STS Token失败:', error)
		throw error
	}
}

/**
 * 通用的文件上传方法
 * 使用OSS PostObject直传
 * @param {string} filePath 文件路径
 * @param {string} purpose 用途（如'avatar', 'solve_image'等）
 * @returns {Promise<string>} 上传后的文件URL
 */
export async function uploadFile(filePath, purpose = 'avatar') {
	try {
		console.log(`=== 开始${purpose}文件上传流程 ===`)
		console.log('文件路径:', filePath)
		console.log('上传用途:', purpose)
		console.log('当前平台:', getCurrentPlatform())

		// 获取用户token
		const token = uni.getStorageSync('token')
		if (!token) {
			throw new Error('未找到登录token，请重新登录')
		}

		// 获取OSS配置
		console.log('获取OSS配置...')
		const ossConfig = await getStsToken(token, purpose)

		// 使用OSS PostObject直传
		console.log('使用OSS PostObject直传...')
		const fileUrl = await uploadToOSSDirectly(filePath, ossConfig)

		console.log('OSS直传成功:', fileUrl)
		return fileUrl

	} catch (error) {
		console.error(`${purpose}文件上传失败:`, error)
		throw error
	}
}

/**
 * 统一的头像上传方法（保持向后兼容）
 * 使用OSS PostObject直传
 * @param {string} filePath 文件路径
 * @returns {Promise<string>} 上传后的文件URL
 */
export async function uploadAvatar(filePath) {
	return uploadFile(filePath, 'avatar')
}
